/****************************************
*  Seg 2501, hiver 2002 Devoir # 4
*
*  Fichier : FileClient.java
*  simule les files d'attente des clients
*  les opérations possibles sur ces files
*
*  @author  Anne Bertrand
*  @author  Robin Tropper
*  @refactoredBy Robin Tropper  B.Sc.A.
*
*****************************************/

import java.util.*;

public class FileClient{
	private Vector<Client> fileAttente = new Vector<Client>();
	private String nom;
	private long heureArrive=0, duree=0, tAttente=0;
	private long tTotal=0, clientsServis=0;
	private long tEnFile=0, execution=0;
	private int delta=0, moyenne=0, i=0;
	private Timer arriveClient;
	
	public FileClient(int moy, int del, Timer arCl, long dur, String nomFile) {
		moyenne = moy;
		delta = del;
		arriveClient = arCl;
		nom = nomFile;
		duree = dur;
		try {
			tEnFile = GenerateurR.generer(moyenne, delta);
			execution += tEnFile;
			ajouteClient();
		}//terminera tout seul après le temps nécessaire
			catch (Exception ex) {
   			System.out.println("Problême à l'ajout d'un/e: "+nom+"\n\t"+ ex);
		}//fin du try-catch pour ajouter
	}//fin constructeur

	
	private void ajouteClient(){
		//la banque ferme!
		if( Banque.getCloture() ){
			return;
		}
   		try {
	   		i++;
	   		System.out.println("Ajouter client " + nom +" " + i); 	
	   			heureArrive = System.currentTimeMillis();
	   			fileAttente.addElement(new Client(heureArrive,nom+i));   		
	   		} catch (Exception ex) {
	   			System.out.println("Problême à l'ajout d'Individu: "+"\n\t"+ ex);
			}//fin du try-catch pour ajouter

            // prévoir le prochain client à venir
		tEnFile = GenerateurR.generer(moyenne, delta);
		execution += tEnFile;
            arriveClient.schedule(new ajouterClient(), execution);
	}//fin ajouteClient
	
	/**
	 * Servir un client implique sortir un client de la file.
	 * @return : le prochain client en attente dans la file OU
	 * null si la file est vide.
	 */
	public synchronized Client Servir(){
		Client bonhomme = null;
		if(fileAttente.size()!=0) {
				clientsServis++;
				bonhomme = (Client)(fileAttente.remove(0));
				tAttente += bonhomme.getAttente();
				tTotal += tAttente+bonhomme.getTempsAServir();
		}//fin du if size
		return bonhomme;
 	}//fin de la méthode Servir
 	
 	public String getNom() { return nom; }

 	public int SizeFile() { return fileAttente.size(); }
 	
	public long getClientsServis() { return clientsServis; }

 	public long Temps() { return tTotal; }
 	
 	public long getMoyAttente() {
 		long retour=0;
 		if (clientsServis!=0) {
 			retour = (tAttente/10)/clientsServis;
 		}
 		return retour;
 	}//fin de getMoyAttente

	 class ajouterClient extends TimerTask {
		public void run() {	
			ajouteClient();
		}//fin du run
	}//fin de classe ajouterClient
	
}//fin de classe FileClient